home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Genie / Projects / AEA / Source / Sources / Object Accessors / AEAAccessorWildFromNull.cc < prev   
Encoding:
C/C++ Source or Header  |  2000-06-24  |  1.4 KB  |  61 lines

  1. /*    ==========================
  2.  *    AEAAccessorWildFromNull.cc
  3.  *    ==========================
  4.  */
  5.  
  6. #include "AEADebugging.h"
  7.  
  8. #include <AERegistry.h>
  9.  
  10. #include "AEAAccessorWildFromNull.hh"
  11. #include "AEAModelRoot.hh"
  12. #include "AEADesc.hh"
  13. #include "AEATokenModel.hh"
  14.  
  15.  
  16. template <class Type>
  17. class StackPointer {
  18. public:
  19.     StackPointer(Type *inPtr) : mPtr(inPtr) {}
  20.     virtual ~StackPointer() {delete mPtr;}
  21. protected:
  22.     Type *mPtr;
  23. };
  24.  
  25. AEAAccessorWildFromNull::AEAAccessorWildFromNull(AEAModelRoot &inRoot)
  26. : AEAAccessor(typeWildCard, typeNull), mRoot(inRoot)
  27. {
  28. }
  29.  
  30. AEAAccessorWildFromNull::~AEAAccessorWildFromNull()
  31. {
  32. }
  33.  
  34. void
  35. AEAAccessorWildFromNull::AccessObject(DescType inDesiredClass, 
  36.     const AEDesc *inContainerToken, DescType inContainerClass, 
  37.     DescType inKeyForm, const AEDesc *inKeyData, AEDesc *outToken) const
  38. {
  39.     // Verify that inContainerToken is actually a null descriptor
  40.     if (inContainerToken->descriptorType != typeNull
  41.         || inContainerToken->dataHandle != NULL
  42.         || inContainerClass != typeNull)
  43.         ThrowOSErr_(errAEWrongDataType);
  44.     
  45.     OSErr err;
  46.     
  47.     AEADesc token;
  48.     AEATokenModel *appToken;
  49.     
  50.     // Create a token to indicate the application, 
  51.     // and have it be destroyed when the current scope ends
  52.     mRoot.MakeToken(appToken);
  53.     StackPointer<AEATokenModel> tokenPtr(appToken);
  54.     
  55.     token.Create(typeModelToken, &appToken, sizeof appToken);
  56.     
  57.     err = ::AECallObjectAccessor(inDesiredClass, &token.Ref(), cApplication, 
  58.         inKeyForm, inKeyData, outToken);
  59.     ThrowIfOSErr_(err);
  60. }
  61.